﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Rendiciones.Logica.Modelos;
using Tesla.Excepciones;
using Tesla.Proveedores;
using Tesla.Validador;

namespace Rendiciones.Logica.Servicios
{
    internal class ServGasto : IServGasto
    {
        
        private readonly IProveedor _proveedor;
        private readonly IValidador _validador;
        
        public ServGasto(IProveedor provedor, IValidador validador)
        {
            _proveedor = provedor;
            _validador = validador;
        }
        
        public List<TipoGasto> TodosLosTiposDeGasto()
        {
            try
            {
                var documentos = _proveedor.Search(new TipoGasto()).ToList();
                return documentos;
            }
            catch (NoHuboResultadosException)
            {
                return new List<TipoGasto>();
            }
        }

        public List<TipoGasto> TiposDeGastoAsociados()
        {
            try
            {
                var documentos = _proveedor.Search(new TipoGasto(),apellido:"Asociado").ToList();
                return documentos;
            }
            catch (NoHuboResultadosException)
            {
                return new List<TipoGasto>();
            }
        }

        public void IngresarRendicion(Rendicion rendicion)
        {
            if (rendicion.IdRendicion.Equals(0))
            {
                _proveedor.Create(ref rendicion);
                rendicion.DetallesGasto.ForEach(g => g.IdRendicion = rendicion.IdRendicion);
                rendicion.DetallesGasto.ForEach(IngresarDetallesRendicion);
            }
            else
            {
                _proveedor.Update<Rendicion>(rendicion);
                rendicion.DetallesGasto.ForEach(ModificarDetallesRendicion);
                rendicion.GastosAEliminar.ForEach(EliminarDetalleRendicion);

            }
        }

        private void IngresarDetallesRendicion(Gasto detalle)
        {
            _proveedor.Create(ref detalle);
        }

        private void ModificarDetallesRendicion(Gasto detalle)
        {
            _proveedor.Update<Gasto>(detalle);
        }

        private void EliminarDetalleRendicion(Gasto detalle)
        {
            //sp_Gasto_Delete  @IdGasto, @IdRendicion";
        }

        public List<Rendicion> BuscarRendicionesPorEstado(int Estado)
        {
            try
            {
                var rendiciones = _proveedor.Search(new Rendicion(),parametrosAdicionales:Estado, apellido: "PorEstado").ToList();
                return rendiciones;
            }
            catch (NoHuboResultadosException)
            {
                return new List<Rendicion>();
            }
        }

        public Rendicion CargarRendicionPorId(int IdRendicion)
        {
            try
            {
                var rendicion = _proveedor.Read(new Rendicion(), IdRendicion, apellido: "PorId");
                return rendicion;
            }
            catch (NoHuboResultadosException)
            {
                return new Rendicion();
            }
        }

        public List<Gasto> BuscarGastosDeRendicion(int IdRendicion)
        {
            try
            {
                var gastos = _proveedor.Search(new Gasto(), IdRendicion, apellido: "DeRendicion").ToList();
                return gastos;
            }
            catch (NoHuboResultadosException)
            {
                return new List<Gasto>();
            }
            
        }

        public List<Proyecto> TodosLosProyectosAsociados(int IdUsuario)
        {
            try
            {
                var proyectos = _proveedor.Search(new Proyecto(), IdUsuario).ToList();
                return proyectos;
            }
            catch (NoHuboResultadosException)
            {
                return new List<Proyecto>();
            }
        }

        
    }

    public interface IServGasto
    {
        
        List<TipoGasto> TodosLosTiposDeGasto();
        List<TipoGasto> TiposDeGastoAsociados();
        void IngresarRendicion(Rendicion rendicion);
        List<Rendicion> BuscarRendicionesPorEstado(int Estado);
        Rendicion CargarRendicionPorId(int IdRendicion);
        List<Gasto> BuscarGastosDeRendicion(int IdRendicion);
        List<Proyecto> TodosLosProyectosAsociados(int IdUsuario);
         
    }
}